package com.yingma.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yingma.system.dao.JcZoneDao;
import com.yingma.system.entity.JcServerZone;
import com.yingma.system.entity.JcZone;
import com.yingma.system.pojo.TreeSelect;
import com.yingma.system.service.JcZoneService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * (JcZone)表服务实现类
 *
 * @author makejava
 * @since 2020-03-18 17:26:52
 */
@Service("jcZoneService")
public class JcZoneServiceImpl implements JcZoneService {
    @Resource
    private JcZoneDao jcZoneDao;

    /**
     * 根据行政区域的ID查询行政区域的信息
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public JcZone queryById(String id) {
        return jcZoneDao.selectById(id);
    }



    /**
     * 新增数据
     *
     * @param jcZone 实例对象
     * @return 实例对象
     */
    @Override
    public JcZone insert(JcZone jcZone) {
        this.jcZoneDao.insert(jcZone);
        return jcZone;
    }



    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(String id) {
        return this.jcZoneDao.deleteById(id) > 0;
    }

    /**
     * 根据 编码或者名称 进行分页查询省级区域信息
     *
     * @param code
     * @param name
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public List<JcZone> getProviceInfo(String code, String name, Integer pageNum, Integer pageSize) {

        QueryWrapper<JcZone> queryWrapper = new QueryWrapper<JcZone>();
        //编码
        if(!code.equals("") && !name.equals("")){
            queryWrapper.like("CODE",code);
            queryWrapper.like("NAME",name);
        }else if(!code.equals("")){
            queryWrapper.like("CODE",code);
        }else if(!name.equals("")){
            queryWrapper.like("NAME",name);
        }
        queryWrapper.like("ZID","root");
        Page<JcZone> page=new Page<>(pageNum,pageSize,true);
        IPage<JcZone> iPage= jcZoneDao.selectPage(page,queryWrapper);
        List<JcZone> list=iPage.getRecords();
        System.out.println("记录条数==>"+list.size());
        //永远都给 list数组的第一个赋值
        if(list.size()>0){
            list.get(0).setTotalpageNum(new Long(iPage.getPages()).intValue());
            list.get(0).setTotalSize(new Long(iPage.getTotal()).intValue());
        }
        return list;
    }

    /**
     * 获取所有的行政区域的信息
     * @param jcZone
     * @return
     */
    @Override
    public List<JcZone> selectZoneList(JcZone jcZone) {

        QueryWrapper<JcZone> queryWrapper=new QueryWrapper<>();
        queryWrapper.select("ID","NAME","ZID");
        Page<JcZone> page=new Page<>(1,3500,true);
        IPage<JcZone> iPage= jcZoneDao.selectPage(page,queryWrapper);
        List<JcZone> list=iPage.getRecords();
        //List<JcZone> jcZoneList= jcZoneDao.selectList(queryWrapper);
        return list;
    }

    /**
     * 根据区域的id查询信息
     * @param zoneid
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public List<JcZone> selectZoneById(String zoneid, Integer pageNum, Integer pageSize) {
        QueryWrapper<JcZone> queryWrapper = new QueryWrapper<JcZone>();
        //编码
        queryWrapper.like("ZID",zoneid);
        Page<JcZone> page=new Page<>(pageNum,pageSize,true);
        IPage<JcZone> iPage= jcZoneDao.selectPage(page,queryWrapper);
        List<JcZone> list=iPage.getRecords();
        System.out.println("记录条数==>"+list.size());
        //永远都给 list数组的第一个赋值
        if(list.size()>0){
            list.get(0).setTotalpageNum(new Long(iPage.getPages()).intValue());
            list.get(0).setTotalSize(new Long(iPage.getTotal()).intValue());
        }
        return list;
    }

    /**
     * 构建前端所需要树结构
     * @param jcZones 部门列表
     * @return
     */
    @Override
    public List<JcZone> buildDeptTree(List<JcZone> jcZones) {
        List<JcZone> returnList = new ArrayList<JcZone>();
        //创建临时集合
        List<String> tempList = new ArrayList<String>();
        for (JcZone jcZone : jcZones)
        {
            //获取部门的id添加到临时的list集合中去
            tempList.add(jcZone.getId());
        }
        for (Iterator<JcZone> iterator = jcZones.iterator(); iterator.hasNext();)
        {
            JcZone jcZone = (JcZone) iterator.next();
            // 如果是顶级节点, 遍历该父节点的所有子节点
            String sa=jcZone.getZid();
            if (sa.equals("root"))
            {
                recursionFn(jcZones, jcZone);
                returnList.add(jcZone);
            }
        }
        if (returnList.isEmpty())
        {
            returnList = jcZones;
        }
        return returnList;
    }

    /**
     * 构建前端所需要下拉树结构
     * @param jcZones 部门列表
     * @return
     */
    @Override
    public List<TreeSelect> buildZoneTreeSelect(List<JcZone> jcZones) {
        List<JcZone> deptTrees = buildDeptTree(jcZones);
        System.out.println(1);
        return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
    }

    /**
     * 递归列表
     */
    private void recursionFn(List<JcZone> list, JcZone t)
    {
        // 得到子节点列表
        List<JcZone> childList = getChildList(list, t);
        t.setChildren(childList);
        for (JcZone tChild : childList)
        {
            if (hasChild(list, tChild))
            {
                //System.out.println("有子节点");
                // 判断是否有子节点
                Iterator<JcZone> it = childList.iterator();
                while (it.hasNext())
                {
                    JcZone n = (JcZone) it.next();
                    recursionFn(list, n);
                }
            }
        }
    }

    /**
     * * 判断一个对象是否为空
     *
     * @param object Object
     * @return true：为空 false：非空
     */
    public static boolean isNull(Object object)
    {
        return object == null;
    }

    /**
     * * 判断一个对象是否非空
     *
     * @param object Object
     * @return true：非空 false：空
     */
    public static boolean isNotNull(Object object)
    {
        return !isNull(object);
    }

    /**
     * 得到子节点列表
     */
    private List<JcZone> getChildList(List<JcZone> list, JcZone t)
    {
        List<JcZone> tlist = new ArrayList<JcZone>();
        Iterator<JcZone> it = list.iterator();
        while (it.hasNext())
        {
            JcZone n = (JcZone) it.next();
            //System.out.println(n);
            if (isNotNull(n.getZid()) && n.getZid().equals(t.getId()))
            {
                tlist.add(n);
            }
        }
        return tlist;
    }
    /**
     * 判断是否有子节点
     */
    private boolean hasChild(List<JcZone> list, JcZone t)
    {
        return getChildList(list, t).size() > 0 ? true : false;
    }


}
